﻿/**
 * 将 CSharp 类型映射为 ExtJs 的 Ext.data.Field 配置、Ext.grid.Column 配置和 Ext.form.Field 配置。
 */
Ext.define('Happy.metadata.CSharpTypeMapper', {
    alternateClassName: ['CSharpTypeMapper'],
    singleton: true,

    /**
     * @private
     * @readonly
     * @property {Object} typeMap 映射信息。
     */

    /**
     * 重写 ExtJs。
     */
    constructor: function () {
        var me = this;

        var intTypeConfig = {
            field: {
                type: 'int'
            },
            editor: {
                xtype: 'numberfield'
            }
        };

        var floatTypeConfig = {
            field: {
                type: 'float'
            },
            editor: {
                xtype: 'numberfield'
            }
        };

        var boolTypeConfig = {
            field: {
                type: 'boolean'
            },
            editor: {
                xtype: 'checkboxfield'
            }
        };

        var stringTypeConfig = {
            field: {
                type: 'string'
            },
            editor: {
                xtype: 'textfield'
            }
        };

        var dateTypeConfig = {
            field: {
                type: 'date',
                dateFormat: 'Y-m-d\\TH:i:s\\Z'
            },
            column: {
                renderer: Ext.util.Format.dateRenderer('Y-m-d')
            },
            editor: {
                xtype: 'datefield',
                format: 'Y-m-d'
            }
        };

        var datetimeTypeConfig = {
            field: {
                type: 'date',
                dateFormat: 'Y-m-d\\TH:i:s\\Z'
            },
            column: {
                width: 130,
                renderer: Ext.util.Format.dateRenderer('Y-m-d H:i:s')
            },
            editor: {
                xtype: 'datefield',
                format: 'Y-m-d H:i:s'
            }
        };

        var complexTypeConfig = {
            field: {
                type: 'auto'
            }
        };

        me.typeMap = {
            'Byte': intTypeConfig,
            'Short': intTypeConfig,
            'Int': intTypeConfig,
            'Long': intTypeConfig,
            'Float': floatTypeConfig,
            'Double': floatTypeConfig,
            'Decimal': floatTypeConfig,
            'Bool': boolTypeConfig,
            'String': stringTypeConfig,
            'Guid': stringTypeConfig,
            'Date': dateTypeConfig,
            'Datetime': datetimeTypeConfig,
            'Complex': complexTypeConfig
        };
    },

    /**
     * 返回 CSharp 类型名称对应的表单 item 默认配置。
     * 
     * @param {String} typeName CSharp 类型名称
     * @return {Object} 表单编辑组件配置
     */
    getFormEditorDefaultConfig: function (typeName) {
        var me = this;

        return me.typeMap[typeName].editor || {};
    },

    /**
     * 返回 CSharp 类型名称对应的表格列默认配置。
     * 
     * @param {String} typeName CSharp 类型名称
     * @return {Object} 表格列配置
     */
    getGridColumnDefaultConfig: function (typeName) {
        var me = this;

        return me.typeMap[typeName].column || {};
    },

    /**
     * 返回 CSharp 类型名称对应的模型字段默认配置。
     * 
     * @param {String} typeName CSharp 类型名称
     * @return {Object} 模型字段配置
     */
    getModelFieldDefaultConfig: function (typeName) {
        var me = this;

        return me.typeMap[typeName].field || {};
    }
});